package com.atguigu.mybatis.demo;

import java.util.Comparator;

/**
 * Created by Smexy on 2023/3/22
 * <p>
 * <p>
 * lamda表达式 是 函数式接口的实例。
 * 写lamda表达式 为了 构造一个 函数式接口的对象。
 * <p>
 * 函数式接口:  一个接口只要标注了 @@FunctionalInterface 注解，就是函数式接口。
 * 除了从Object继承的方法外，只有一个抽象方法。
 * <p>
 * lamda表达式语法:
 * (参数列表) -> { 方法体  }
 * 参数列表： 函数式接口唯一的抽象方法的参数列表
 * 方法体：   函数式接口唯一的抽象方法的实现
 * <p>
 * ①参数列表中的参数类型可以省略，由编译器推导
 * ②参数列表中只有一个参数，()可以省略
 * ③方法体中，如果只有一行代码，{}可以省略，return也可以省略。
 * <p>
 * <p>
 * --------------
 * 为接口提供实例的方式：
 * ①使用外部类 实现接口，创建外部类对象
 * ②使用内部类 实现接口，创建内部类对象
 * ③接口只用一次，可以使用匿名内部类
 */
public class LamdaDemo
{
    public static void main(String[] args) {

        //匿名内部类
        Comparator<Integer> comparator = new Comparator<Integer>()
        {
            @Override
            public int compare(Integer o1, Integer o2) {
                return o1.compareTo(o2);
            }
        };

        System.out.println(comparator.compare(1, 2));

        // 使用lamda表达式
        Comparator<Integer> comparator1 = (o1, o2) -> o1.compareTo(o2);

        System.out.println(comparator1.compare(1, 2));


        /*
            lamda表达式还有一种特殊的方式称为方法引用。

            方法引用： 如果函数式结果要实现的抽象方法的实现 和一个类中现有的方法一模一样，此时
                        本着不要重复造轮子的原则，可以直接引用 现有的方法。
                            格式： 类::方法
         */
        Comparator<Integer> comparator2 = (Integer x, Integer y) -> (x < y) ? -1 : ((x == y) ? 0 : 1);

        Comparator<Integer> comparator3 = Integer::compareTo;

        System.out.println(comparator3.compare(1, 2));


    }
}
